package br.com.sgbl.dao;
/**
 *
 * @author Heidi Kussakawa
 */

import br.com.sgbl.bean.Funcionario;
import br.com.sgbl.utils.Conexao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;

public class FuncionarioDao {

    private static final String SQL_LISTAR =
            "SELECT * FROM funcionario";
    private static final String SQL_INSERIR =
            "INSERT INTO funcionario (id, nome, tipo, login , senha, endereco, cpf, status) VALUES (?,?,?,?,?,?,?,?)";
    private static final String SQL_ALTERAR =
            "UPDATE funcionario SET nome = ?, endereco = ?,login = ?, senha = ?, cpf = ?, tipo = ?, status = ? WHERE id = ?";
    private static final String SQL_EXCLUIR =
            "DELETE FROM funcionario WHERE id = ?";

    public Funcionario localizar(Connection conn, long codigo) throws SQLException {
        PreparedStatement ps = conn.prepareStatement(SQL_LISTAR + " where id = ?");
        ps.setLong(1, codigo);

        ResultSet rs = ps.executeQuery();

        if (rs.first()) {
            Funcionario funcionario = new Funcionario();
            funcionario.setId(rs.getLong("id"));
            funcionario.setNome(rs.getString("NOME"));
            funcionario.setEndereco(rs.getString("ENDERECO"));
            funcionario.setLogin(rs.getString("login"));
            funcionario.setSenha(rs.getString("senha"));
            funcionario.setCpf(rs.getLong("cpf"));
            funcionario.setTipo(rs.getString("tipo"));
            funcionario.setStatus(rs.getString("STATUS"));

            return funcionario;
        } else {
            return null;
        }
    }

    public Funcionario salvar(Funcionario funcionario) throws SQLException {
        if (funcionario.getId() == 0) {
            return inserir(funcionario);
        } else {
            return alterar(funcionario);
        }
    }

    private Funcionario inserir(Funcionario funcionario) throws SQLException {
        Connection conn = Conexao.getConnection();

        try {
            PreparedStatement ps = conn.prepareStatement(SQL_INSERIR,
                    PreparedStatement.RETURN_GENERATED_KEYS);

            ps.setNull(1, Types.NULL);
            ps.setString(2, funcionario.getNome());
            ps.setString(3, funcionario.getTipo());
            ps.setString(4, funcionario.getLogin());
            ps.setString(5, funcionario.getSenha());
            ps.setString(6, funcionario.getEndereco());
            ps.setLong(7, funcionario.getCpf());
            ps.setString(8, funcionario.getStatus());

            ps.executeUpdate();

            ResultSet rs = ps.getGeneratedKeys();
            rs.first();

            funcionario.setId(rs.getLong("GENERATED_KEY"));

            conn.commit();
        } finally {
            conn.close();
        }

        return funcionario;
    }

    private Funcionario alterar(Funcionario funcionario) throws SQLException {
        Connection conn = Conexao.getConnection();

        try {
            PreparedStatement ps = conn.prepareStatement(SQL_ALTERAR);

            ps.setString(1, funcionario.getNome());
            ps.setString(2, funcionario.getEndereco());
            ps.setString(3, funcionario.getLogin());
            ps.setString(4, funcionario.getSenha());
            ps.setLong(5, funcionario.getCpf());
            ps.setString(6, funcionario.getTipo());
            ps.setString(7, funcionario.getStatus());
            ps.setLong(8, funcionario.getId());


            ps.executeUpdate();

            conn.commit();
        } finally {
            conn.close();
        }

        return funcionario;
    }

    public List listar() throws SQLException {
        List lista = new ArrayList();

        Connection conn = Conexao.getConnection();

        try {
            PreparedStatement ps = conn.prepareStatement(SQL_LISTAR);

            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                Funcionario funcionario = new Funcionario();

                funcionario.setId(rs.getLong("id"));
                funcionario.setNome(rs.getString("nome"));
                funcionario.setEndereco(rs.getString("endereco"));
                funcionario.setLogin(rs.getString("login"));
                funcionario.setSenha(rs.getString("senha"));
                funcionario.setCpf(rs.getLong("cpf"));
                funcionario.setTipo(rs.getString("tipo"));
                funcionario.setStatus(rs.getString("status"));

                lista.add(funcionario);
            }
        } finally {
            conn.close();
        }

        return lista;
    }

    public void excluir(Funcionario funcionario) throws SQLException {
        Connection conn = Conexao.getConnection();

        try {
            PreparedStatement ps = conn.prepareStatement(SQL_EXCLUIR);

            ps.setLong(1, funcionario.getId());

            ps.executeUpdate();

            conn.commit();
        } finally {
            conn.close();
        }
    }
    
    public Funcionario logar(Funcionario funcionario) throws SQLException {

        Connection conn = Conexao.getConnection();

            PreparedStatement ps = conn.prepareStatement(SQL_LISTAR + " where login = ? and senha = ?");

            ps.setString(1, funcionario.getLogin());
            ps.setString(2, funcionario.getSenha());

            ResultSet rs = ps.executeQuery();

        if (rs.first()) {
            Funcionario func = new Funcionario();
            func.setId(rs.getLong("id"));
            func.setLogin(rs.getString("login"));
            func.setSenha(rs.getString("senha"));

            return func;
        } else {
            return null;
        }

    }
}
